<?php
/**
 * Работа с данными хостов
 *
 * @ingroup Models
 */
class Host extends Record {
    public function setTableDefinition() {
        $this->setTableName("hosts");

        $this->hasColumn("id", "integer", array("unsigned" => TRUE, "primary" => TRUE, "autoincrement" => TRUE));
        $this->hasColumn("name", "string", array("length" => LENGTH_NAME, "notnull" => TRUE));

        $this->index("idx_name", array("type" => "unique", "fields" => array("name")));
    }

    public function setUp() {
    }

    public function create($url) {
        $name = self::nameReverse($url);
        if( $name ) {
            parent::create(array(
                "name" => $name,
            ));
        } else {
            throw new Exception(_("Неправильное имя хоста"));
        }
    }

    public function __toString() {
        return $this->getName();
    }

    public function getName() {
        return self::nameStraight($this->name);
    }

    public function getReverseName() {
        return $this->name;
    }

    public function getUrl() {
        return Url::normalize("http://" . $this->getName());
    }

    public function getIconUrl() {
        return self::getIconUrlForName($this->getName());
    }

    public static function getIconUrlForName($host_name) {
        return "http://favicons.tools.strangecompany.ru/?domain=".$host_name;
    }

    public static function getIconUrlByUrl( $url ) {
        $host = parse_url($url, PHP_URL_HOST);

        return self::getIconUrlForName($host);
    }

    /**
     * Разворачивает имя домена в обратном порядке (т.е. www.google.com => com.google.www)
     *
     * @param string $name имя домена или URL
     * @return string
     */
    public static function nameReverse( $name ) {
        if ( ( $pos = strpos( $name, "://" ) ) !== FALSE ) {
            $name = substr( $name, $pos + 3 );
        }
        if ( ( $pos = strpos( $name, "/" ) ) !== FALSE ) {
            $name = substr( $name, 0, $pos );
        }
        //Переворачиваем доменное имя
        $name = implode( ".", array_reverse( explode( ".", $name ) ) );
        return $name;
    }

    /**
     * Разворачивае имя домена из обратного порядка в прямой (т.е. com.google.www => www.google.com)
     *
     * @param string $name развёрнутое имя домена
     * @return string
     */
    public static function nameStraight( $name ) {
        return implode( ".", array_reverse( explode( ".", $name ) ) );
    }
}

/**
 * Коллекция хостов
 *
 * @ingroup Collections
 */
class HostTable extends Doctrine_Table {
    public function getByName( $hostname ) {
        $hostname = Url::normalize( trim( $hostname ) );

        if( empty($hostname)) {
            return NULL;
        }
        $host = $this->findByName( $hostname );

        if ( ! $host ) {
            $host = new Host();
            $host->create( $hostname);
        }

        return $host;
    }

    public function findByName($name) {
        $name = Url::normalize(trim($name));
        if( empty($name) ) {
            return NULL;
        }
        $name = Host::nameReverse($name);
        return $this->findOneByName($name);
    }
}